<?php
//文档见：http://docs.jpush.cn/display/dev/Push-API-v3
/**
 * 极光推送类
 * @author chenlisong E-mail:chenlisong1021@163.com 
 * @version 创建时间：2015年11月21日 上午9:46:31 
 * 类说明
 */
class Jpush{

	//若实例化的时候传入相应的值则按新的相应值进行
	public function __construct() {
		$this->app_jpush_key = C('APP_JPUSH_KEY');
		$this->app_jpush_master_secret = C('APP_JPUSH_MASTER_SECRET');
		$this->url = "https://api.jpush.cn/v3/push";//推送的地址
	} 
	
	/**
	 * 极光推送
	 */
	public function jpushAll($msg,$code,$param){
		$platFrom = 'all';//目标用户终端手机的平台类型android,ios,winphone
		$audience = 'all';
		$back['message'] = '推送成功';
		$back['status'] = true;
		$result = $this->push($platFrom,$audience,$msg,$code,$param);
		if($result){
			$res = json_decode($result,true);
			if(isset($res['error'])){     
				$back['message'] = '错误'.$res['error']['code'].':'.$res['error']['message'];
				$back['status'] = false;
			}
		}else{
			$back['message'] = '接口调用失败或无响应';
			$back['status'] = false;
		}
		return $back;
	}
	
	/**
	 * 根据ID向用户推送
	 */
	public function jpushByRegId($regId,$msg,$code="",$param=""){
		$platFrom = 'all';//推送平台
		$audience = array('registration_id'=>array($regId));    //Id
		$result = $this->push($platFrom,$audience,$msg,$code,$param);
		if($result){
			$res = json_decode($result,true);
			if(isset($res['error'])){
				$back['message'] = '错误'.$res['error']['code'].':'.$res['error']['message'];
				$back['status'] = false;
			}
		}else{
			$back['message'] = '接口调用失败或无响应';
			$back['status'] = false;
		}
		return $result;
	}
	
	/**
	 * @param string $audience
	 *		all 字符串 该产品下面的所有用户. 对app_key下的所有用户推送消息
	 *		tag(20个)Array标签组(并集): tag=>array('昆明','北京','曲靖','上海');
	 *		tag_and(20个)Array标签组(交集): tag_and=>array('广州','女');
	 *		alias(1000)Array别名(并集): alias=>array('93d78b73611d886a74*****88497f501','606d05090896228f66ae10d1*****310');
	 *		registration_id(1000)注册ID设备标识(并集): registration_id=>array('20effc071de0b45c1a**********2824746e1ff2001bd80308a467d800bed39e');
	 * @param string $content 推送的内容。
	 * @param string $m_type 推送附加字段的类型(可不填) http,tips,chat....
	 * @param string $m_txt 推送附加字段的类型对应的内容(可不填) 可能是url,可能是一段文字。
	 * @param string $m_time 保存离线时间的秒数默认为一天(可不传)单位为秒
	 * @return Ambigous <boolean, mixed>|boolean
	 */
	public function push($platFrom='all',$audience='all',$content='',$code="",$param="",$title=""){
		$base64=base64_encode("$this->app_jpush_key:$this->app_jpush_master_secret");
		$header=array("Authorization:Basic $base64","Content-Type:application/json");
		$data = array();
		$data['platform'] = $platFrom;          //目标用户终端手机的平台类型android,ios,winphone
		$data['audience'] = $audience;      //目标用户
		$data['notification'] = array(
				//统一的模式--标准模式
				"alert"=>$content,
				//安卓自定义
				"android"=>array(
						"alert"=>$content,
						"title"=>"",
						"builder_id"=>0,
						"extras"=>array("code"=>$code, "param"=>$param)//可以用来传递所需参数,后期需要时拓展
				),
				//ios的自定义
				"ios"=>array(
						"alert"=>$content,
						"badge"=>"1",
						"sound"=>"default",
						"extras"=>array("code"=>$code, "param"=>$param)//可以用来传递所需参数,后期需要时拓展
				),
		);
		//苹果专属--应用内消息
		$data['message'] = array(
				"msg_content"=>$content,
				"extras"=>array("code"=>$code, "param"=>$param)//可以用来传递所需参数,后期需要时拓展
		);
		//附加选项
		$data['options'] = array(
				"sendno"=>time(),
				"time_to_live"=>86400, //保存离线时间的秒数默认为一天
				"apns_production"=>true,        //指定 APNS 通知发送环境：false开发环境，true生产环境。
		);
		$data = json_encode($data);
		$res = $this->push_curl($data,$header);
		if($res){       //得到返回值--成功已否后面判断
			return $res;
		}else{          //未得到返回值--返回失败
			return false;
		}
	}

	//推送的Curl方法
	public function push_curl($param="",$header="") {
		if (empty($param)) { return false; }
		$postUrl = $this->url;
		$curlPost = $param;
		$ch = curl_init();                                      //初始化curl
		curl_setopt($ch, CURLOPT_URL,$postUrl);                 //抓取指定网页
		curl_setopt($ch, CURLOPT_HEADER, 0);                    //设置header
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            //要求结果为字符串且输出到屏幕上
		curl_setopt($ch, CURLOPT_POST, 1);                      //post提交方式
		curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
		curl_setopt($ch, CURLOPT_HTTPHEADER,$header);           // 增加 HTTP Header（头）里的字段
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);        // 终止从服务端进行验证
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
		$data = curl_exec($ch);                                 //运行curl
		curl_close($ch);
		return $data;
	}
}